﻿<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:spun="http://spun.googlecode.com/svn/tags/2008-02-01/Views.xsd"
                xmlns:html="http://www.w3.org/1999/xhtml">
    <xsl:template match="html:*" mode="ViewConstruction">
        <xsl:param name="PathRoot" />

        <xsl:text>new HtmlView('</xsl:text>
        <xsl:value-of select="local-name()"/>
        <xsl:text>', [</xsl:text>
        <xsl:apply-templates select="* | text()" mode="ViewConstruction">
            <xsl:with-param name="PathRoot" select="$PathRoot" />
        </xsl:apply-templates>
        <xsl:text>], {</xsl:text>
        <xsl:apply-templates select="@*" mode="ViewConstruction" />
        <xsl:text>}),
        </xsl:text>
    </xsl:template>

    <xsl:template match="@*" mode="ViewConstruction">
        <xsl:value-of select="local-name()"/>
        <xsl:text>: '</xsl:text>
        <xsl:value-of select="."/>
        <xsl:text>', </xsl:text>
    </xsl:template>

    <xsl:template match="text()" mode="ViewConstruction">
        <xsl:text>new TextView('</xsl:text>
        <xsl:value-of select="normalize-space(.)"/>
        <xsl:text>'), </xsl:text>
    </xsl:template>

    <xsl:template match="spun:* | html:*[@spun:view | @spun:sequence]" mode="ViewConstruction">
        <xsl:param name="PathRoot" />

        <xsl:apply-templates select="." mode="Construction">
            <xsl:with-param name="PathRoot" select="$PathRoot" />
        </xsl:apply-templates>

        <xsl:text>,
        </xsl:text>
    </xsl:template>

    <!-- Construction -->

    <xsl:template match="spun:inline" mode="Construction">
        <xsl:param name="PathRoot" />
        <xsl:call-template name="ConstructControl">
            <xsl:with-param name="ControlClass" select="'InlineControl'" />
            <xsl:with-param name="PathRoot" select="$PathRoot" />
        </xsl:call-template>
    </xsl:template>

    <xsl:template match="spun:text" mode="Construction">
        <xsl:param name="PathRoot" />
        <xsl:call-template name="ConstructControl">
            <xsl:with-param name="ControlClass" select="'TextControl'" />
            <xsl:with-param name="PathRoot" select="$PathRoot" />
        </xsl:call-template>
    </xsl:template>

    <xsl:template match="spun:int" mode="Construction">
        <xsl:param name="PathRoot" />
        <xsl:call-template name="ConstructControl">
            <xsl:with-param name="ControlClass" select="'IntControl'" />
            <xsl:with-param name="PathRoot" select="$PathRoot" />
        </xsl:call-template>
    </xsl:template>

    <xsl:template match="spun:float" mode="Construction">
        <xsl:param name="PathRoot" />
        <xsl:call-template name="ConstructControl">
            <xsl:with-param name="ControlClass" select="'FloatControl'" />
            <xsl:with-param name="PathRoot" select="$PathRoot" />
        </xsl:call-template>
    </xsl:template>

    <xsl:template match="spun:button" mode="Construction">
        <xsl:text>new ButtonControl('</xsl:text>
        <xsl:value-of select="@controller"/>
        <xsl:text>', '</xsl:text>
        <xsl:value-of select="@action"/>
        <xsl:text>', [</xsl:text>
        <xsl:apply-templates select="node()" mode="ViewConstruction" />
        <xsl:text>])</xsl:text>
    </xsl:template>

    <xsl:template match="html:*[@spun:view]" mode="Construction">
        <xsl:param name="PathRoot" />

        <xsl:call-template name="ConstructControl">
            <xsl:with-param name="ControlClass">
                <xsl:value-of select="@spun:view" />
                <xsl:text>_Template</xsl:text>
            </xsl:with-param>
            <xsl:with-param name="PathRoot" select="$PathRoot" />
            <xsl:with-param name="AdditionalArguments">
                <xsl:text>'</xsl:text>
                <xsl:value-of select="local-name()"/>
                <xsl:text>'</xsl:text>
            </xsl:with-param>
        </xsl:call-template>
    </xsl:template>

    <xsl:template match="html:*[@spun:sequence]" mode="Construction">
        <xsl:param name="PathRoot" />

        <xsl:call-template name="ConstructControl">
            <xsl:with-param name="ControlClass">
                <xsl:text>SequenceView</xsl:text>
            </xsl:with-param>
            <xsl:with-param name="PathRoot">
                <xsl:value-of select="$PathRoot"/>
            </xsl:with-param>
            <xsl:with-param name="AdditionalArguments">
                <xsl:text>'</xsl:text>
                <xsl:value-of select="local-name()"/>
                <xsl:text>', function(pathRoot) {&#10;</xsl:text>

                <xsl:text>    return [&#10;</xsl:text>
                <xsl:apply-templates select="* | text()" mode="ViewConstruction">
                    <xsl:with-param name="PathRoot" select="'pathRoot + '" />
                </xsl:apply-templates>

                <xsl:text>    ];&#10;</xsl:text>
                
                <xsl:text>}</xsl:text>
            </xsl:with-param>
            <xsl:with-param name="Path" select="@spun:sequence" />
        </xsl:call-template>
    </xsl:template>
    
    <xsl:template match="spun:*" mode="Construction">
        <xsl:text>/* Not a supported type: </xsl:text>
        <xsl:value-of select="local-name()" />
        <xsl:text> */</xsl:text>
    </xsl:template>

    <xsl:template name="ConstructControl">
        <xsl:param name="ControlClass" />
        <xsl:param name="PathRoot" />
        <xsl:param name="AdditionalArguments" />
        <xsl:param name="Path" select="@path" />

        <xsl:text>new </xsl:text>
        <xsl:value-of select="$ControlClass"/>
        <xsl:text>(</xsl:text>
        <xsl:value-of select="$PathRoot"/>
        <xsl:text>'</xsl:text>
        <xsl:value-of select="$Path"/>
        <xsl:text>'</xsl:text>
        <xsl:if test="$AdditionalArguments">
            <xsl:text>, </xsl:text>
            <xsl:value-of select="$AdditionalArguments"/>
        </xsl:if>
        <xsl:text>)</xsl:text>
    </xsl:template>
</xsl:stylesheet>
